home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / PRG / ICProgKit 1.3.sit / ICProgKit1.3 / Internet Config Source / ICLinkInSubs.p < prev    next >
Text File  |  1995-11-04  |  14KB  |  505 lines

  1. unit ICLinkInSubs;
  2.  
  3. interface
  4.  
  5.     uses
  6. {$ifc undefined THINK_Pascal}
  7.         Types, Files, QuickDraw, Aliases, 
  8. {$endc}
  9.         ICTypes, ICKeys;
  10.  
  11. { Names changed to ICU to avoit name clash in .o files }
  12.  
  13.     function ICUEditPreferences (key: Str255; prefsfile: FSSpec): ICError;
  14.  
  15.     function ICUFindScheme (urlh: Handle; var scheme: Str255): ICError;
  16.     function ICULaunchURL (helper: OSType; urlh: Handle): ICError;
  17.     function ICUHaveProcessManager: ICError;
  18.     function ICUHaveNewStandardFile: Boolean;
  19.     function ICUFSSPecToFullPath (fs: FSSpec; var path: str255): OSErr;
  20.     function ICUCanInteract: ICError;
  21.  
  22.     function ICFileSpecToFSSpec (filespec: ICFileSpecHandle; can_interact: Boolean; var fs: FSSpec): ICError;
  23.     function FSSpecToICFileSpec (var fs: FSSpec; filespec: ICFileSpecHandle): OSErr;
  24.  
  25. implementation
  26.  
  27.     uses
  28. {$ifc undefined THINK_Pascal}
  29.         GestaltEqu, Errors, ToolUtils, Packages, 
  30. {$endc}
  31.         Processes, AppleEvents;
  32.  
  33.     function ICUHaveProcessManager: ICError;
  34.         var
  35.             gv: longint;
  36.     begin
  37.         if (Gestalt(gestaltOSAttr, gv) = noErr) & (BTST(gv, gestaltLaunchControl)) then begin
  38.             ICUHaveProcessManager := noErr;
  39.         end
  40.         else begin
  41.             ICUHaveProcessManager := unimpErr;
  42.         end; (* if *)
  43.     end; (* HaveProcessManager *)
  44.  
  45.     function ICUCanInteract: ICError;
  46.         var
  47.             err: ICError;
  48.             info: ProcessInfoRec;
  49.             process_us, process_foreground: ProcessSerialNumber;
  50.             result: boolean;
  51.     begin
  52.         err := noErr;
  53.         if (err = noErr) & (ICUHaveProcessManager = noErr) then begin
  54.             process_us.highLongOfPSN := 0;
  55.             process_us.lowLongOfPSN := kCurrentProcess;
  56.             err := GetFrontProcess(process_foreground);
  57.             if err = noErr then begin
  58.                 err := SameProcess(process_us, process_foreground, result);
  59.             end;
  60.             if (err = noErr) & not result then begin
  61.                 err := errAENoUserInteraction;
  62.             end;
  63.         end;
  64.         ICUCanInteract := err;
  65.     end;
  66.  
  67.     function ICUHaveNewStandardFile: Boolean;
  68.         var
  69.             gv: longInt;
  70.     begin
  71.         ICUHaveNewStandardFile := (Gestalt(gestaltStandardFileAttr, gv) = noErr) & (BTST(gv, gestaltStandardFile58));
  72.     end;
  73.  
  74.     function ICUHaveAliasManager: Boolean;
  75.         var
  76.             gv: longInt;
  77.     begin
  78.         ICUHaveAliasManager := (Gestalt(gestaltAliasMgrAttr, gv) = noErr) & (BTST(gv, gestaltAliasMgrPresent));
  79.     end;
  80.  
  81.     function ICUFindProcess (creator, typ: OSType; var process: ProcessSerialNumber; var fs: FSSpec): boolean;
  82.         var
  83.             info: ProcessInfoRec;
  84.             oe: OSErr;
  85.             gv: longInt;
  86.     begin
  87.         ICUFindProcess := false;
  88.         if ICUHaveProcessManager = noErr then begin
  89.             process.highLongOfPSN := 0;
  90.             process.lowLongOfPSN := kNoProcess;
  91.             info.processInfoLength := sizeof(ProcessInfoRec);
  92.             info.processName := nil;
  93.             info.processAppSpec := @fs;
  94.             while GetNextProcess(process) = noErr do begin
  95.                 if (GetProcessInformation(process, info) = noErr) & (info.processType = longInt(typ)) & (info.processSignature = creator) then begin
  96.                     ICUFindProcess := true;
  97.                     leave;
  98.                 end; (* if *)
  99.             end; (* while *)
  100.         end; (* if *)
  101.     end; (* FindProcess *)
  102.  
  103.     function GetVolInfo (var name: str63; var vrn: integer; index: integer): OSErr;
  104.         var
  105.             pb: paramBlockRec;
  106.             oe: OSErr;
  107.     begin
  108.         if (name <> '') & (name[length(name)] <> ':') then begin
  109.             name := concat(name, ':');
  110.         end; (* if *)
  111.         pb.ioNamePtr := @name;
  112.         pb.ioVRefNum := vrn;
  113.         pb.ioVolIndex := index;
  114.         oe := PBGetVInfo(@pb, false);
  115.         if oe = noErr then begin
  116.             vrn := pb.ioVRefNum;
  117.         end; (* if *)
  118.         GetVolInfo := oe;
  119.     end; (* GetVolInfo *)
  120.  
  121.     function ConfirmAppl (creator: OSType; var fss: FSSpec): OSErr;
  122.         var
  123.             err: OSErr;
  124.             info: FInfo;
  125.     begin
  126.         err := HGetFInfo(fss.vRefNum, fss.parID, fss.name, info);
  127.         if err = noErr then begin
  128.             if (info.fdType <> 'APPL') or (info.fdCreator <> creator) then begin
  129.                 err := afpItemNotFound;
  130.             end; (* if *)
  131.         end; (* if *)
  132.         ConfirmAppl := err;
  133.     end; (* ConfirmAppl *)
  134.  
  135.     function ScanVolume (creator: OSType; vref: integer; var fs: FSSpec): OSErr;
  136.         var
  137.             err: OSErr;
  138.             file_index: integer;
  139.             pbdt: DTPBRec;
  140.             found: boolean;
  141.     begin
  142.         fs.name := '';
  143.         pbdt.ioNamePtr := @fs.name;
  144.         pbdt.ioVRefNum := vref;
  145.         err := PBDTGetPath(@pbdt);
  146.         if err = noErr then begin
  147.             file_index := 1;
  148.             found := false;
  149.             repeat
  150.                 pbdt.ioIndex := file_index;
  151.                 pbdt.ioFileCreator := creator;
  152.                 err := PBDTGetAPPLSync(@pbdt);
  153.                 if err = noErr then begin
  154.                     fs.vRefNum := vref;
  155.                     fs.parID := pbdt.ioAPPLParID;
  156.                     (* name is already put in by GetAPPL call *)
  157.                     found := (ConfirmAppl(creator, fs) = noErr);
  158.                 end; (* if *)
  159.                 file_index := file_index + 1;
  160.             until found or (err <> noErr);
  161.         end; (* if *)
  162.         ScanVolume := err;
  163.     end; (* ScanVolume *)
  164.  
  165.     function ICUFindApplication (creator: OSType; var fs: FSSpec): OSErr;
  166.         var
  167.             err: OSErr;
  168.             vol_index: integer;
  169.             vref: integer;
  170.             found: boolean;
  171.     begin
  172.         found := false;
  173.         vol_index := 1;
  174.         repeat
  175.             vref := 0;
  176.             err := GetVolInfo(fs.name, vref, vol_index);
  177.             if err = noErr then begin
  178.                 err := ScanVolume(creator, vref, fs);
  179.                 if err = noErr then begin
  180.                     found := true;
  181.                 end
  182.                 else begin
  183.                     err := noErr;        (* swallow error so we continue with next volume *)
  184.                 end; (* if *)
  185.             end; (* if *)
  186.             vol_index := vol_index + 1;
  187.         until found or (err <> noErr);
  188.         if not found then begin
  189.             err := afpItemNotFound;
  190.             fs.vRefNum := 0;
  191.             fs.parID := 2;
  192.             fs.name := '';
  193.         end; (* if *)
  194.         ICUFindApplication := err;
  195.     end; (* FindApplication *)
  196.  
  197.     function PrepareToLaunch (var theEvent: AppleEvent; tofront: boolean; var launchThis: LaunchParamBlockRec): ICError;
  198.         var
  199.             launchDesc: AEDesc;
  200.     begin
  201.         PrepareToLaunch := AECoerceDesc(theEvent, typeAppParameters, launchDesc);
  202.         HLock(handle(launchDesc.dataHandle));
  203.         launchThis.launchAppParameters := AppParametersPtr(launchDesc.dataHandle^);
  204.         launchThis.launchBlockID := extendedBlock;
  205.         launchThis.launchEPBLength := extendedBlockLen;
  206.         launchThis.launchFileFlags := 0;
  207.         launchThis.launchControlFlags := launchContinue + launchNoFileFlags;
  208.         if not tofront then begin
  209.             launchThis.launchControlFlags := launchThis.launchControlFlags + launchDontSwitch;
  210.         end; (* if *)
  211.     end; (* PrepareToLaunch *)
  212.  
  213.     function CreateGURLEvent (creator: OSType; urlh: Handle; var theEvent: AppleEvent): ICError;
  214.         var
  215.             targetAddress: AEDesc;
  216.             err: ICError;
  217.             junk: ICError;
  218.             err2: ICError;
  219.             s: signedByte;
  220.     begin
  221.         err := AECreateDesc(typeApplSignature, @creator, sizeof(creator), targetAddress);
  222.         err2 := AECreateAppleEvent('GURL', 'GURL', targetAddress, kAutoGenerateReturnID, kAnyTransactionID, theEvent);
  223.         if err = noErr then begin
  224.             err := err2;
  225.         end; (* if *)
  226.         s := HGetState(urlh);
  227.         HLock(urlh);
  228.         err2 := AEPutKeyPtr(theEvent, keyDirectObject, typeChar, urlh^, GetHandleSize(urlh));
  229.         HSetState(urlh, s);
  230.         if err = noErr then begin
  231.             err := err2;
  232.         end; (* if *)
  233.         if err <> noErr then begin
  234.             junk := AEDisposeDesc(theEvent);
  235.         end; (* if *)
  236.         junk := AEDisposeDesc(targetAddress);
  237.         CreateGURLEvent := err;
  238.     end; (* CreateGURLEvent *)
  239.  
  240.     function CreateEditPrefEvent (creator: OSType; key: Str255; prefsfile: FSSpec; var theEvent: AppleEvent): ICError;
  241.         var
  242.             targetAddress: AEDesc;
  243.             err: ICError;
  244.             junk: ICError;
  245.             err2: ICError;
  246.     begin
  247.         err := AECreateDesc(typeApplSignature, @creator, sizeof(creator), targetAddress);
  248.         err2 := AECreateAppleEvent('ICAp', 'ICAp', targetAddress, kAutoGenerateReturnID, kAnyTransactionID, theEvent);
  249.         if err = noErr then begin
  250.             err := err2;
  251.         end; (* if *)
  252.         err2 := AEPutKeyPtr(theEvent, '----', 'TEXT', @key[1], length(key));
  253.         if err = noErr then begin
  254.             err := err2;
  255.         end; (* if *)
  256.         err2 := AEPutKeyPtr(theEvent, 'dest', 'fss ', @prefsfile, sizeof(prefsfile));
  257.         if err = noErr then begin
  258.             err := err2;
  259.         end; (* if *)
  260.         if err <> noErr then begin
  261.             junk := AEDisposeDesc(theEvent);
  262.         end; (* if *)
  263.         junk := AEDisposeDesc(targetAddress);
  264.         CreateEditPrefEvent := err;
  265.     end; (* CreateEditPrefEvent *)
  266.  
  267.     function LaunchFSSpec (var fs: FSSpec; theEvent: AppleEvent): ICError;
  268.         var
  269.             launchThis: LaunchParamBlockRec;
  270.             launchDesc: AEDesc;
  271.             err: ICError;
  272.     begin
  273.         launchThis.launchAppSpec := @fs;
  274.         err := PrepareToLaunch(theEvent, true, launchThis);
  275.         if err = noErr then begin
  276.             err := LaunchApplication(@launchThis);
  277.         end; (* if *)
  278.         if err = memFullErr then begin
  279.             launchThis.launchControlFlags := bor(launchThis.launchControlFlags, launchUseMinimum);
  280.             err := LaunchApplication(@launchThis);
  281.         end; (* if *)
  282.         LaunchFSSpec := err;
  283.     end; (* LaunchFSSpec *)
  284.  
  285.     function SendEvent (theEvent: AppleEvent; creator: OSType): ICError;
  286.         var
  287.             err: ICError;
  288.             psn: ProcessSerialNumber;
  289.             app_fs: FSSpec;
  290.             junk: ICError;
  291.             reply: AppleEvent;
  292.     begin
  293.         if ICUFindProcess(creator, 'APPL', psn, app_fs) then begin
  294.             junk := SetFrontProcess(psn);
  295.             err := AESend(theEvent, reply, kAENoReply, kAEHighPriority, kNoTimeOut, nil, nil);
  296.         end
  297.         else begin
  298.             err := ICUFindApplication(creator, app_fs);
  299.             if err = noErr then begin
  300.                 err := LaunchFSSpec(app_fs, theEvent);
  301.             end; (* if *)
  302.         end; (* if *)
  303.         SendEvent := err;
  304.     end; (* SendEvent *)
  305.  
  306.     function ICUEditPreferences (key: Str255; prefsfile: FSSpec): ICError;
  307.         var
  308.             err: ICError;
  309.             junk: ICError;
  310.             theEvent: AppleEvent;
  311.     begin
  312.         err := ICUHaveProcessManager;
  313.         if err = noErr then begin
  314.             err := CreateEditPrefEvent(ICcreator, key, prefsfile, theEvent);
  315.             if err = noErr then begin
  316.                 err := SendEvent(theEvent, ICcreator);
  317.             end; (* if *)
  318.             junk := AEDisposeDesc(theEvent);
  319.         end; (* if *)
  320.         ICUEditPreferences := err;
  321.     end; (* EditPreferences *)
  322.  
  323.     function ICUFindScheme (urlh: Handle; var scheme: Str255): ICError;
  324.         var
  325.             err: ICError;
  326.             tmp: Str15;
  327.             ndx: longint;
  328.     begin
  329.         err := noErr;
  330.         tmp := ':';
  331.         ndx := Munger(Handle(urlh), 0, @tmp[1], length(tmp), nil, 0);
  332.         if (ndx < 0) or (ndx > 255) then begin
  333.             err := icNoURLErr;
  334.         end; (* if *)
  335.         if err = noErr then begin
  336. {$push}
  337. {$r-}
  338.             scheme[0] := chr(ndx);
  339.             BlockMove(urlh^, @scheme[1], ndx);
  340. {$pop}
  341.         end; (* if *)
  342.         ICUFindScheme := err;
  343.     end; (* FindScheme *)
  344.  
  345.     function ICULaunchURL (helper: OSType; urlh: Handle): ICError;
  346.         var
  347.             err: ICError;
  348.             junk: ICError;
  349.             theEvent: AppleEvent;
  350.     begin
  351.         err := ICUHaveProcessManager;
  352.         if err = noErr then begin
  353.             err := CreateGURLEvent(helper, urlh, theEvent);
  354.             if err = noErr then begin
  355.                 err := SendEvent(theEvent, helper);
  356.             end; (* if *)
  357.             junk := AEDisposeDesc(theEvent);
  358.         end; (* if *)
  359.         ICULaunchURL := err;
  360.     end; (* LaunchURL *)
  361.  
  362.     function FSpGetCatInfo (var fs: FSSpec; index: integer; var pb: CInfoPBRec): OSErr;
  363.     begin
  364.         pb.ioVRefNum := fs.vRefNum;
  365.         pb.ioDirID := fs.parID;
  366.         pb.ioNamePtr := @fs.name;
  367.         pb.ioFDirIndex := index;
  368.         FSpGetCatInfo := PBGetCatInfoSync(@pb);
  369.     end;
  370.  
  371.     function ICUFSSPecToFullPath (fs: FSSpec; var path: str255): OSErr;
  372.         var
  373.             err: OSErr;
  374.             pb: CInfoPBRec;
  375.             s: str63;
  376.     begin
  377.         if fs.parID = 1 then begin
  378.             path := concat(fs.name, ':');
  379.         end
  380.         else begin
  381.             path := fs.name;
  382.             while (err = noErr) & (fs.parID <> 1) do begin
  383.                 err := FSpGetCatInfo(fs, -1, pb);
  384.                 path := concat(fs.name, ':', path);
  385.                 fs.parID := pb.ioFlParID;
  386.             end;
  387.         end;
  388.         ICUFSSPecToFullPath := err;
  389.     end;
  390.  
  391.     function GetVolumeStuff (name: str31; date: longInt; var vrn: integer): OSErr;
  392.         var
  393.             err: OSErr;
  394.             pb: HParamBlockRec;
  395.             s: str255;
  396.             pass, i: integer;
  397.     begin
  398.         for pass := 1 to 2 do begin
  399.             i := 1;
  400.             while true do begin
  401.                 pb.ioVolIndex := i;
  402.                 i := i + 1;
  403.                 pb.ioNamePtr := @s;
  404.                 s := '';
  405.                 err := PBGetVInfoSync(@pb);
  406.                 if err <> noErr then begin
  407.                     leave;
  408.                 end;
  409.                 if IUEqualString(name, s) = 0 then begin
  410.                     if (pass = 2) or (pb.ioVCrDate = date) then begin
  411.                         leave;
  412.                     end;
  413.                 end;
  414.             end;
  415.             if err = noErr then begin
  416.                 leave;
  417.             end;
  418.         end;
  419.         if err = noErr then begin
  420.             vrn := pb.ioVRefNum;
  421.         end;
  422.         GetVolumeStuff := err;
  423.     end;
  424.  
  425.     function ICFileSpecToFSSpec (filespec: ICFileSpecHandle; can_interact: Boolean; var fs: FSSpec): ICError;
  426.         var
  427.             err: ICError;
  428.             loe: longInt;
  429.             attr: longint;
  430.             pb: CInfoPBRec;
  431.             alias: AliasHandle;
  432.             aliasCount: integer;
  433.             needsUpdate: Boolean;
  434.             rule_mask: longInt;
  435.     begin
  436.         err := noErr;
  437.         if (err = noErr) & (GetHandleSize(Handle(filespec)) < SizeOf(ICFileSpec)) then begin
  438.             err := paramErr;
  439.         end;
  440.         if err = noErr then begin
  441.             err := -1;
  442.             if ICUHaveAliasManager & (filespec^^.alias.aliasSize <> 0) then begin
  443.                 alias := AliasHandle(filespec);
  444.                 err := HandToHand(Handle(alias));
  445.                 if err = noErr then begin
  446.                     loe := Munger(Handle(alias), 0, nil, SizeOf(ICFileSpec) - SizeOf(AliasRecord), @loe, 0);
  447.                     aliasCount := 1;
  448.                     rule_mask := kARMSearch + kARMMountVol;
  449.                     if can_interact & (ICUCanInteract <> noErr) then begin
  450.                         rule_mask := rule_mask + kARMNoUI;
  451.                     end;
  452.                     err := MatchAlias(nil, rule_mask, alias, aliasCount, @fs, needsUpdate, nil, nil);
  453.                 end;
  454.                 DisposeHandle(Handle(alias));
  455.             end;
  456.             if err <> noErr then begin
  457.                 err := GetVolumeStuff(filespec^^.vol_name, filespec^^.vol_creation_date, fs.vRefNum);
  458.                 if err = noErr then begin
  459.                     fs.parID := filespec^^.fss.parID;
  460.                     fs.name := filespec^^.fss.name;
  461.                     err := FSpGetCatInfo(fs, 0, pb);
  462.                 end;
  463.             end;
  464.         end;
  465.         ICFileSpecToFSSpec := err;
  466.     end;
  467.  
  468.     function FSSpecToICFileSpec (var fs: FSSpec; filespec: ICFileSpecHandle): OSErr;
  469.         var
  470.             alias: AliasHandle;
  471.             pb: HParamBlockRec;
  472.             err: OSErr;
  473.             vname: Str63;
  474.             loe: longInt;
  475.     begin
  476.         SetHandleSize(Handle(filespec), SizeOf(ICFileSpec));
  477.         err := MemError;
  478.         if err = noErr then begin
  479.             pb.ioVRefNum := fs.vRefNum;
  480.             pb.ioVolIndex := 0;
  481.             pb.ioNamePtr := @vname;
  482.             err := PBGetVInfoSync(@pb);
  483.             if err = noErr then begin
  484.                 filespec^^.vol_creation_date := pb.ioVCrDate;
  485.                 filespec^^.vol_name := vname;
  486.             end; (* if *)
  487.             filespec^^.fss := fs;
  488.             filespec^^.alias.userType := OSType(0);
  489.             filespec^^.alias.aliasSize := 0;
  490.         end;
  491.         if (err = noErr) & ICUHaveAliasManager then begin
  492.             err := NewAlias(nil, fs, alias);
  493.             if err = noErr then begin
  494.                 err := HandAndHand(Handle(alias), Handle(filespec));
  495.                 if err = noErr then begin
  496.                     loe := Munger(Handle(filespec), SizeOf(ICFileSpec) - SizeOf(AliasRecord), nil, SizeOf(AliasRecord), @loe, 0);
  497.                 end;
  498.                 DisposeHandle(Handle(alias));
  499.             end;
  500.             err := noErr;
  501.         end;
  502.         FSSpecToICFileSpec := err;
  503.     end; (* FSSpecToICFileSpec *)
  504.  
  505. end. (* ICLinkInSubs *)